package com.gdawj.mdb;

import com.gdawj.javabeans.Etudiant;
import com.gdawj.javabeans.EtudiantCours;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session;

@MessageDriven(mappedName = "jms/webcole/Topic", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic")
    })
public class AbsenceMDB implements MessageListener {

    private final Logger logger=Logger.getLogger(this.getClass().getName());

    // utilisation de JMS
    @Resource(mappedName="jms/webcole/ConnectionFactory")
    private ConnectionFactory connectionFactory;
    @Resource(mappedName="jms/webcole/Queue")
    private Queue queue;
    
    Connection connection;


    public AbsenceMDB() {
    }

    public void onMessage(Message message) 
    {
        // lire le topic
        if(message instanceof ObjectMessage)
        {
            try{
                // reception d'un nouveau message
                ObjectMessage messageMDB=(ObjectMessage)message;
                List<EtudiantCours> listeEtudiantsCours=(ArrayList<EtudiantCours>)messageMDB.getObject();
                // envoyer mail
                this.envoyerEmail(listeEtudiantsCours);
                // poster un nouveau message dans la queue
                this.posterMessage(listeEtudiantsCours);
            }catch(Exception e){
               e.printStackTrace();
            }
        }
    }


    public void envoyerEmail(List<EtudiantCours> listeEtudiantsCours)
    {
        // generer la liste des absences
        for(EtudiantCours ec : listeEtudiantsCours){
            Etudiant e=ec.getEtudiant();
            logger.log(Level.INFO, "Cours : "+ec.getCours().getLibelle());
            logger.log(Level.INFO, "Etudiant : "+e.getNom()+" "+e.getPrenom()+" "+e.getEmail()+" présence : "+ec.isAbsence());
        }
        // envoi de la liste avec une session JavaMail
        //...
    }
    
    @PostConstruct
    public void initialiser(){
        try{
        // creer la connexion JMS
        connection=connectionFactory.createConnection();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    @PreDestroy
    public void fermer(){
        try{
        // fermer la connexion
        connection.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    public void posterMessage(List<EtudiantCours> listeEtudiantsCours)
    {
        try{
        // creer la session
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // creer le producteur de message
        MessageProducer producer=session.createProducer(queue);
        // creer un message de la liste des etudiants au cours
        ObjectMessage messageJMS=session.createObjectMessage();
        messageJMS.setObject((Serializable)listeEtudiantsCours);
        // envoyer le message
        producer.send(messageJMS);
        session.close();
        }
        catch(JMSException e){
           e.printStackTrace();
        }
    }

}
